package com.zjitc;

/**
 * Hello world!
 *
 * @author jsonor
 */
public class App {

  /**
   * 思路扩展
   * 1. 出去面试
   *
   * redis 缓存问题
   * redis api 以及基本用法（配置，连接池操作，spring和redis的简单整合）
   * today 我们将 秒杀的实现
   * 同一个商品，瞬间可能会有个几千个或者几万个请求
   *
   * 回忆一下，普通商品购买的时候你的Service逻辑:
   * request?productId=xxxx&count=yyyy
   *
   * ProductController --> ProductService
   * 查询剩余商品的库存
   *    if (has库存) {
   *      update库存
   *      生成一个order
   *    } else {
   *      responseError
   *    }
   * 当两个用户分别要购买2个和4个商品的时候，假设此时的库存只有4个
   * 1. 两个人同时执行了has库存方法，那么此时，两个人同时得到的库存数量都是4
   * 2. 实际在库存只有4的情况下，你就有可能卖出去6个商品
   *
   * 如果有秒杀，出现1w个请求直接到mysql中去，不考虑数据准确性的情况下，mysql已经崩溃了
   * 即便mysql是可以承受住并发请求查询的，那么也会出现超售的情况
   *
   * 解决方法：
   * 1. 如果从java代码层面，怎么解决多线程并发的问题
   *
   * synchronized(locker)锁去进行代码上的同步
   *
   * synchronized(productionService) {
   *    if (has库存) {
   *      update库存
   *      生成一个order
   *    } else {
   *      responseError
   *    }
   * }
   *
   * 造成秒杀的时候，完全阻塞，而且，synchronized无法保证顺序执行
   *
   * 2. 从数据库层去解决，使用数据库的事务操作
   * 3. 使用redis缓存的方式去解决秒杀商品的时候的高并发读和写的问题
   *    秒杀的几种方式
   *    1) 数量为主
   *          a) 读和写速度非常快
   *          b) redis上的操作都是事务
   *       将秒杀商品准备销售的数量，以key-value的形式存入到redis中
   *       key : SECOND_KILL_UP
   *       value : 3
   *       对key进行减法操作，如果返回值大于等于0，就表示该用户秒杀成功，此时此时直接修改数据库，就可能出现
   *       最后一个人先修改了为0，后面那个人又改成了1
   *    2) 时间，几点到几点方式
   *
   * 如何将秒杀的商品自动化上线
   * 1. 秒杀商品用的jsp模板 进行简单的if判断或者什么方式进行集成
   * 2. 需要将秒杀的数据肯定是先存入到mysql数据库的，两种方式去做:
   *    1) 扩展product表的字段
   *          --> isKillProduction
   *    2) 新建一张表
   *          --> 秒杀的表
   *          secondKillProductTable
   *          Filed:
   *            ProductId
   *            killProductionPrice,
   *            killProductionStartTime,
   *            KillProductionStopTime,
   *            killProductionCount
   *    3) 商品信息本身在缓存中
   *          --> 再将秒杀表的数据载入到缓存中即可
   *
   *
   * 几个问题:
   * 可靠，稳定
   * 1. 万一开始的时候，我们的缓存中是没有数据的在办呢？
   *      --> 只能查数据库 --> 想办法保证此时只有一个人查询数据库
   *      boolean flag = false;
   *      秒杀也有先后顺序，第一个人过来的时候，发现缓存中没有数据，flag = true，赶紧去查数据库，存入缓存，
   *      ...-->Queue()
   * 2. 网页有倒计时 ajax请求，要求更新缓存
   *
   */

  public static void main(String[] args) {
  }
}
